import os
import pickle
import time

'1、统计目录下每个文件类型的文件数，传入需要统计的文件名（带路径），返回统计结果字典'
def countDirectoryDescript(osDir):
    allList=os.listdir(osDir)   #换回列表模式的所有文件名以及目录名（不包含路径）
    countFile_dict={}
    for fileOrDir in allList:
        fileOrDir = osDir+'\\'+fileOrDir
        if os.path.isdir(fileOrDir):  # 判断指定的路径是否是目录
            countFile_dict.setdefault('文件夹', 0)
            countFile_dict['文件夹'] += 1
        else:
            allfile = os.path.splitext(fileOrDir)[1]  # 分离文件名与路径，返回元祖
            countFile_dict.setdefault(allfile,0)
            countFile_dict[allfile]+=1
    return countFile_dict
def run_1():
    osDir=input('请输入要统计的文件夹:')
    fileTypeCount_dict=countDirectoryDescript(osDir)
    for i in fileTypeCount_dict:
        print('【%s】文件夹下共有类型为【%s】的文件共%d个' % (osDir, i, fileTypeCount_dict[i]))

'2、计算机给定的文件夹下所有文件的大小'
def fileSizeDescript():
    osDir = input('请输入要统计的文件夹:')
    allList = os.listdir(osDir)
    i=0
    for file in allList:
        file=osDir+'\\'+file
        if os.path.isfile(file):            #判断指定路径是否存在且是一个文件
            i+=1
            fname=os.path.basename(file)
            name=(os.path.splitext(fname))[0]
            print('第%d个文件：[%s]，文件大小是：%d'%(i,name,os.path.getsize(file)))

'3、查找输入的文件名是否在输入的路径中存在，路径需要包含子目录'
def searchFileIncludeChildFolder():
    def findFolder(initFolder):
        initFolders=os.listdir(initFolder)
        for fileAndFolder in initFolders:
            fileAndFolder=initFolder+'\\'+fileAndFolder
            if os.path.isdir(fileAndFolder):
                findFolder(fileAndFolder)
            else:
                if os.path.basename(fileAndFolder)==searchFile:
                    print(fileAndFolder)
                continue
    initFolder=input('请输入带查找的初始目录：')
    searchFile=input('请输入需要查找的目标文件：')
    findFolder(initFolder)

'4、搜索所有视频格式，并创建一个文件vedioList.txt,存放所有找的的文件路径'
def searchVideoFile():
    listVideoFile=[]
    def findFolder(initFolder):  
        initFolders = os.listdir(initFolder)
        for fileAndFolder in initFolders:
            fileAndFolder = initFolder+'\\'+fileAndFolder
            if os.path.isdir(fileAndFolder):
                findFolder(fileAndFolder)
            else:
                if fileAndFolder.find('mp4') > 0 or fileAndFolder.find('avi') > 0 or fileAndFolder.find('rmvb') > 0:
                    listVideoFile.append(fileAndFolder)
                continue
    initFolder = input('请输入带查找的初始目录：')
    findFolder(initFolder)
    with open('e:/vedioList.txt','w',encoding='utf-8') as target:
        for l in listVideoFile:
            target.write(l+'\n')

# 查找字符串中，某个单词出现的位置，返回位置列表题目5用到此函数
def searchWordPosities(line1, word):
    list1 = line1.split(word)
    j = []
    k = 0
    for l in list1:
        i = len(l)+1+k
        j.append(i)
        k = i
    j.pop()
    return j

'5、搜索所有文本文件，显示输入的关键字在文件中的具体位置'
def searchFileContent():
    def findFolder(initFolder):
        initFolders = os.listdir(initFolder)
        for fileAndFolder in initFolders:
            fileAndFolder = initFolder+'\\'+fileAndFolder
            if os.path.isdir(fileAndFolder):
                findFolder(fileAndFolder)
            else:
                if fileAndFolder.find('txt') > 0 :
                    with open(fileAndFolder,encoding='utf-8') as target:
                        contentList=target.readlines()
                        i=0
                        for line in contentList:
                            if line.find(searchWord) !=-1:
                                i=1
                                print('在文件【%s】中找到关键字【%s】'%(fileAndFolder,searchWord))
                                break
                        if i==1:
                            for line in contentList:
                                if line.find(searchWord)!=-1:
                                    list1 = searchWordPosities(line,searchWord)
                                    print('关键字出现在第'+str(i)+'行，第'+str(list1)+'个位置')
                                i+=1        
                continue
    searchWord=input('请将该脚本放于待查找的文件夹内，请输入关键字：')
    judge=input('请问是否需要打印关键字【%s】在文件中的具体位置（YES/NO):'%searchWord)
    currentFolder=os.getcwd()
    if judge=='YES':
        findFolder(currentFolder)

'6、把传入的数据对象通过pickle存入二进制文件'
def saveToFile(dataType):
    filetype=dataType
    localtime = time.strftime('%D%H%M%S', time.localtime(time.time()))   #生成当前时间
    fileName = localtime[6:]+str(type(filetype))[8:12]+'.pickle'  # 生成以当前时间和传入类型为主的文件名
    file= open(fileName,'wb')
    pickle.dump(filetype,file)
    file.close()
    print('文件保存在'+os.getcwd()+'\\'+fileName)

'7、从文件中读取二进制数数据'
def readToFile(fileName):
    file=open(fileName,'rb')
    mydata=pickle.load(file)
    file.close()
    return mydata
    
    
'8、打印存入的数据对象'
def printData(datatype):
    filetype = str(type(datatype))
    if filetype.find('dict') > -1:
        for dic in datatype:
            print(dic,datatype[dic])
    elif filetype.find('list') > -1:
        for lis in datatype:
            print(lis)
# dict={'1':1,'2':2}
# printData(dict)
data=countDirectoryDescript('c:\windows')
saveToFile(data)
data1 = readToFile('E:\learn\python\\18132439dict.pickle')
printData(data1)
